package Control;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.ArrayList;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; //import javax.servlet.http.HttpSession;

import utils.UploadArquivo;

import Bean.BeanFilme;
import Bean.BeanFilmeConsulta;
import Bean.BeanUsuario;
import Model.Filme;
import DAO.DAOFilme;

/**
 * Servlet implementation class ControladorFilme
 */
public class ControladorFilme extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, Exception {

		response.setContentType("text/html;charset=ISO-8859-1");
		PrintWriter out = response.getWriter();

		try {
			String opcao = request.getParameter("opcao");
			HttpSession session = request.getSession();
			BeanUsuario usuario = (BeanUsuario) session
					.getAttribute("beanUsuario");

			if (usuario == null) {
				response.sendRedirect("AcessoAoSistema/login.jsp");
			} else {
				if (!usuario.isIs_Admin())
					response.sendRedirect("AcessoAoSistema/login.jsp");
				else {
					if (opcao != null) {
						if (opcao.equals("salvar")) {
							this.incluirFilme(request, response);
							this.listarFiltro(request, response);
						} else if (opcao.equals("atualizar")) {
							this.atualizarFilme(request, response);
							this.listarFiltro(request, response);
						} else if (opcao.equals("listarTodos")) {
							this.listarTodosFilmes(request, response);

						} else if (opcao.equals("pesquisar")) {

							this.listarFiltro(request, response);
						} else if (opcao.equals("editar")) {
							this.editarFilme(request, response);
						} else if (opcao.equals("excluir")) {
							this.excluirFilme(request, response);
							
						} else if (opcao.equals("enviar")) {
							this.enviarArquivo(request, response);
						} else if (opcao.equals("novo")) {
							this.novoFilme(request, response);
						} else
							response.sendRedirect("../paginaPrincipal.jsp");

					}
				}
			}

		} catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		} finally {
			out.close();
		}
	}

	private void novoFilme(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		BeanFilme bFilme = new BeanFilme();
		request.setAttribute("beanFilme", bFilme);
		// atualizar lista de pesquias
		DAOFilme dao2 = new DAOFilme();
		BeanFilmeConsulta beanConsulta = new BeanFilmeConsulta();
		beanConsulta.setNumeroPaginas(atualizaPaginacao(request, response,
				false));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);
		beanConsulta.setFilmes(dao2.listarTodosFilme(pagina));

		request.setAttribute("beanFilmeConsulta", beanConsulta);

		RequestDispatcher dispatcher = request
				.getRequestDispatcher("Filmes/gerenciarFilmes.jsp");
		dispatcher.forward(request, response);

	}

	private void incluirFilme(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOFilme dao = new DAOFilme();
		String arq[] = request.getParameter("caminhoImagemEnviar")
				.split("\\\\");
		String temp = request.getParameter("dataEstreiaFormatada").substring(6,
				10)
				+ "-"
				+ request.getParameter("dataEstreiaFormatada").substring(3, 5)
				+ "-"
				+ request.getParameter("dataEstreiaFormatada").substring(0, 2);
		Date dataEstreia = Date.valueOf(temp);
		Filme filme = new Filme(request.getParameter("nomeFilme"), request
				.getParameter("nomeFilmeOriginal"), request
				.getParameter("nomeDiretor"), Integer.parseInt(request
				.getParameter("duracao")), request.getParameter("sinopse"),
				Integer.parseInt(request.getParameter("idadeMinima")),
				arq[arq.length - 1], dataEstreia, 0, request
						.getParameter("tipo"));
		// atualizar lista de pesquias
		DAOFilme dao2 = new DAOFilme();
		BeanFilmeConsulta beanConsulta = new BeanFilmeConsulta();
		beanConsulta.setNumeroPaginas(atualizaPaginacao(request, response,
				false));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);
		beanConsulta.setFilmes(dao2.listarTodosFilme(pagina));

		request.setAttribute("beanFilmeConsulta", beanConsulta);

		int resultado = dao.salvarFilme(filme);

		if (resultado == 0) {
			response.sendRedirect("AcessoAoSistema/login.jsp");
		} else {
			response.sendRedirect("ControladorFilme?opcao=editar&codigo="
					+ resultado + "&result=Sucesso");
		}
	}

	private void atualizarArquivo(Integer codigo, String nomeArquivo,
			HttpServletResponse response) throws Exception {
		DAOFilme dao = new DAOFilme();
		if (!dao.atualizarArquivo(codigo, nomeArquivo)) {
			response.sendRedirect("AcessoAoSistema/login.jsp");
		}
	}

	private void atualizarFilme(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOFilme dao = new DAOFilme();
		String temp = request.getParameter("dataEstreiaFormatada").substring(6,
				10)
				+ "-"
				+ request.getParameter("dataEstreiaFormatada").substring(3, 5)
				+ "-"
				+ request.getParameter("dataEstreiaFormatada").substring(0, 2);
		Date dataEstreia = Date.valueOf(temp);
		Filme filme = new Filme(request.getParameter("nomeFilme"), request
				.getParameter("nomeFilmeOriginal"), request
				.getParameter("nomeDiretor"), Integer.parseInt(request
				.getParameter("duracao")), request.getParameter("sinopse"),
				Integer.parseInt(request.getParameter("idadeMinima")), request
						.getParameter("caminhoImagem"), dataEstreia, Integer
						.parseInt(request.getParameter("codigo")), request
						.getParameter("tipo"));
		if (!dao.atualizarFilme(filme)) {
			response.sendRedirect("AcessoAoSistema/login.jsp");
		} else
			response.sendRedirect("ControladorFilme?opcao=editar&codigo="
					+ request.getParameter("codigo") + "&result=Sucesso");
	}

	private ArrayList<Integer> atualizaPaginacao(HttpServletRequest request,
			HttpServletResponse response, boolean filtro) throws Exception {

		DAOFilme daoPaginanacao = new DAOFilme();
		ArrayList<Integer> paginacao = new ArrayList<Integer>();
		if (filtro) {

			int idadeMinima = 0;
			String filtroNome = "";
			if ((request.getParameter("filtroIdadeMinima") != null)
					&& (!request.getParameter("filtroIdadeMinima").equals("")))
				idadeMinima = Integer.parseInt(request
						.getParameter("filtroIdadeMinima"));
			if (request.getParameter("filtroNomeFilme") != null)
				filtroNome = request.getParameter("filtroNomeFilme");
			Integer numero = daoPaginanacao.buscaNumeroPaginasFiltro(
					filtroNome, idadeMinima);
			for (int i = 1; i <= numero; i++) {
				paginacao.add(i);
			}

		} else {
			Integer numero = daoPaginanacao.buscaNumeroPaginasTodos();
			for (int i = 1; i <= numero; i++) {
				paginacao.add(i);
			}

		}

		return paginacao;

	}

	private int verificaPaginacao(HttpServletRequest request,
			HttpServletResponse response) {
		String numPag = request.getParameter("numPag");
		// BeanFilmeConsulta bean = (BeanFilmeConsulta)
		// request.getAttribute("beanFilmeConsulta");
		String paginaAtual = request.getParameter("paginaAtual");

		int iPaginaAtual; // = bean.getNumeroPaginas().size();
		if (paginaAtual != null)
			iPaginaAtual = Integer.parseInt(paginaAtual);
		else
			iPaginaAtual = 1;

		if (numPag != null) {
			if (numPag.equals("Primeira")) {
				numPag = "1";
			} else {
				if (numPag.equals("Ultima")) {
					numPag = "999";
				} else {
					if (numPag.equals("Anterior")) {
						if (iPaginaAtual > 1) {
							Integer temp = iPaginaAtual - 1;
							numPag = temp.toString();
						} else {
							numPag = "1";
						}
					} else {
						if (numPag.equals("Proxima")) {

							Integer temp = iPaginaAtual + 1;
							numPag = temp.toString();

						}
					}

				}
			}
			return Integer.parseInt(numPag);
		} else
			return 1;

	}

	private void listarTodosFilmes(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOFilme dao = new DAOFilme();
		BeanFilmeConsulta beanConsulta = new BeanFilmeConsulta();
		beanConsulta.setNumeroPaginas(atualizaPaginacao(request, response,
				false));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);
		beanConsulta.setFilmes(dao.listarTodosFilme(pagina));

		request.setAttribute("beanFilmeConsulta", beanConsulta);
		// response.sendRedirect("Filmes/gerenciarFilmes.jsp");

		RequestDispatcher dispatcher = request
				.getRequestDispatcher("Filmes/gerenciarFilmes.jsp");
		dispatcher.forward(request, response);

	}

	private void listarFiltro(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOFilme dao = new DAOFilme();
		BeanFilmeConsulta beanConsulta = new BeanFilmeConsulta();
		beanConsulta
				.setNumeroPaginas(atualizaPaginacao(request, response, true));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);

		int idadeMinima = 0;
		String filtroNome = "";
		if ((request.getParameter("filtroIdadeMinima") != null)
				&& (!request.getParameter("filtroIdadeMinima").equals("")))
			idadeMinima = Integer.parseInt(request
					.getParameter("filtroIdadeMinima"));
		if (request.getParameter("filtroNomeFilme") != null)
			filtroNome = request.getParameter("filtroNomeFilme");
		ArrayList<Filme> listarFiltroFilme = dao.listarFiltroFilme(filtroNome,
				idadeMinima, pagina);
		beanConsulta.setFilmes(listarFiltroFilme);
		request.setAttribute("beanFilmeConsulta", beanConsulta);
		RequestDispatcher dispatcher = request
				.getRequestDispatcher("Filmes/gerenciarFilmes.jsp");
		dispatcher.forward(request, response);
	}

	private void editarFilme(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOFilme dao = new DAOFilme();
		String codigo = request.getParameter("codigo");
		Filme filme = dao.buscarFilme(Integer.parseInt(codigo));
		BeanFilme bean = new BeanFilme(filme.getNomeFilme(), filme
				.getNomeFilmeOriginal(), filme.getNomeDiretor(), filme
				.getDuracao(), filme.getSinopse(), filme.getIdadeMinima(),
				filme.getCaminhoImagem(), filme.getDataEstreia(), filme
						.getCodigo(), filme.getTipo());
		request.setAttribute("beanFilme", bean);
		// atualizar lista de pesquias
		DAOFilme dao2 = new DAOFilme();
		BeanFilmeConsulta beanConsulta = new BeanFilmeConsulta();
		beanConsulta.setNumeroPaginas(atualizaPaginacao(request, response,
				false));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);
		beanConsulta.setFilmes(dao2.listarTodosFilme(pagina));

		request.setAttribute("beanFilmeConsulta", beanConsulta);
		RequestDispatcher dispatcher = request
				.getRequestDispatcher("Filmes/gerenciarFilmes.jsp");
		dispatcher.forward(request, response);
	}

	private void enviarArquivo(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		UploadArquivo uploadArquivo = new UploadArquivo();
		uploadArquivo
				.uploadArquivo(
						request,
						getServletContext()
								.getRealPath(
										"../../../../../../MelhorCinema/WebContent/imagens/imagensFilmes")
								+ "/", request.getParameter("codigo") + ".jpg");
		atualizarArquivo(Integer.parseInt(request.getParameter("codigo")),
				request.getParameter("codigo") + ".jpg", response);
		response.sendRedirect("ControladorFilme?opcao=editar&codigo="
				+ request.getParameter("codigo") + "&result=SucessoEnvio");
		//RequestDispatcher dispatcher = request
			//	.getRequestDispatcher("ControladorFilme?opcao=editar&codigo="
				//		+ request.getParameter("codigo"));
	//	dispatcher.forward(request, response);
		// response.sendRedirect("Filmes/gerenciarFilmes.jsp");
	}

	private void excluirFilme(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOFilme dao = new DAOFilme();
		String codigo = request.getParameter("codigo");
		 try{
		 dao.excluirFilme(Integer.parseInt(codigo)); 
			 response.sendRedirect("ControladorFilme?opcao=pesquisar&result=Sucesso");
		 } catch (Exception e) {
			// TODO: handle exception
		
			 response.sendRedirect("ControladorFilme?opcao=pesquisar&result=dependencia");
		 }
		
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (Exception e) {
			Logger.getLogger(ControladorFilme.class.getName()).log(
					Level.SEVERE, null, e);
		}
	}

	/**
	 * Handles the HTTP <code>POST</code> method.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 *             if a servlet-specific error occurs
	 * @throws IOException
	 *             if an I/O error occurs
	 */
	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (Exception e) {
			Logger.getLogger(ControladorFilme.class.getName()).log(
					Level.SEVERE, null, e);
		}
	}

	/**
	 * Returns a short description of the servlet.
	 * 
	 * @return a String containing servlet description
	 */
	@Override
	public String getServletInfo() {
		return "Short description";
	}// </editor-fold>

}
